module NOPDETECTOR(nop, instruction,
                    raddr1, raddr2, raddr3,
                    EXEMEM_reg_waddr, EXEMEM_reg_wen,
                    MEMWB_reg_waddr, MEMWB_reg_wen);

   output nop;
   input wire [31:0] instruction;
   input wire [4:0] raddr1, raddr2, raddr3;
   input wire [4:0]  EXEMEM_reg_waddr, MEMWB_reg_waddr;
   input wire EXEMEM_reg_wen;
   input wire MEMWB_reg_wen;
   //assign nop = (EXEMEM_reg_wen && EXEMEM_reg_waddr != 0 && (EXEMEM_reg_waddr == raddr1 || EXEMEM_reg_waddr == raddr2 || EXEMEM_reg_waddr == raddr3)) || (MEMWB_reg_wen && (MEMWB_reg_waddr != 0) && (MEMWB_reg_waddr == raddr1 || MEMWB_reg_waddr == raddr2 || MEMWB_reg_waddr == raddr3));
   // wire       EXEMEM_addr, MEMWB_addr;
   // assign EXEMEM_addr = (EXEMEM_reg_waddr == raddr1 || EXEMEM_reg_waddr == raddr2 || EXEMEM_reg_waddr == raddr3);
   // assign MEMWB_addr = (MEMWB_reg_waddr == raddr1 || MEMWB_reg_waddr == raddr2 || MEMWB_reg_waddr == raddr3);
   // assign nop = (EXEMEM_reg_wen && EXEMEM_reg_waddr != 0 && EXEMEM_addr) || (MEMWB_reg_wen && (MEMWB_reg_waddr != 0) && MEMWB_addr);
   wire       raddr1_conflict;
   wire       raddr2_conflict;
   wire       raddr3_conflict;
   wire       [3:0] inst_class;
   assign inst_class = instruction[31:28];
   assign raddr1_conflict = (EXEMEM_reg_wen && EXEMEM_reg_waddr == raddr1 && EXEMEM_reg_waddr != 0) || (MEMWB_reg_wen && MEMWB_reg_waddr == raddr1 && MEMWB_reg_waddr != 0);
   assign raddr2_conflict = (EXEMEM_reg_wen && EXEMEM_reg_waddr == raddr2 && EXEMEM_reg_waddr != 0) || (MEMWB_reg_wen && MEMWB_reg_waddr == raddr2 && MEMWB_reg_waddr != 0);
   assign raddr3_conflict = (EXEMEM_reg_wen && EXEMEM_reg_waddr == raddr3 && EXEMEM_reg_waddr != 0) || (MEMWB_reg_wen && MEMWB_reg_waddr == raddr3 && MEMWB_reg_waddr != 0);
   assign nop = raddr1_conflict ||
                (raddr2_conflict && (inst_class != 4'b1001)) ||
                (raddr3_conflict && inst_class == 4'b0011);
endmodule
